package com.itheima.reggie.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.IService;
import com.itheima.reggie.common.BaseContext;
import com.itheima.reggie.common.R;
import com.itheima.reggie.entity.ShoppingCart;
import com.itheima.reggie.service.ShoppingCartService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 购物车控制器
 */
@RequestMapping("/shoppingCart")
@Slf4j
@RestController
public class ShoppingCartController {

    @Autowired
    private ShoppingCartService cartService;

    // 方法：名称、参数、返回值(R<String>)
    @PostMapping("/add")
    public R<ShoppingCart> add(@RequestBody ShoppingCart cart){
        log.info("[购物车-添加]，cart:{}",cart);
        // 业务逻辑分析，确定添加购物车做做哪些事情
        // cart对象，目前缺什么？用户ID，确定数量，创建时间（没有自动填充）
        // 1.获取用户id,从哪里获取登录用户的ID（session或ThreadLocal）
        // 用户Id,C端用，谁在买，与后台用户没有关系
        Long userId = BaseContext.getCurrentId();
        cart.setUserId(userId);
        // 购物车里面，可能套餐（ID），可能是菜品（ID)，同一时刻，要么是菜品，要么套餐
        // 2.我们需要确定当前菜品和套餐是否在购物车中

        LambdaQueryWrapper<ShoppingCart> cartLambdaQueryWrapper = new LambdaQueryWrapper<>();
        if (cart.getDishId() != null){
            // 添加到购物车的是菜品
            cartLambdaQueryWrapper.eq(ShoppingCart::getDishId,cart.getDishId());
        }else {
            // 添加到购物车的是套餐
            cartLambdaQueryWrapper.eq(ShoppingCart::getSetmealId,cart.getSetmealId());
        }

        ShoppingCart cartOne = cartService.getOne(cartLambdaQueryWrapper);
        if (cartOne != null){
            // 如果查到了有这个菜品或套餐， 只需添加数量就可以
            cartOne.setNumber(cartOne.getNumber()+1);
            // 更新数据库
            cartService.updateById(cartOne);
        }else {
            // 没有查到，需要新增
            // 用户Id 确定数量，创建时间（没有自动填充）
            cart.setNumber(1);
            cart.setCreateTime(LocalDateTime.now());
            // 保存数据库
            cartService.save(cart);
            cartOne = cart;
        }
        // 最终需要数据保存到购物车表（结果）
        return R.success(cartOne);
    }

    // 购物车列表
    // 千万不能传参，否则就是漏洞
    @GetMapping("/list")
    public R<List<ShoppingCart>> list(){
        log.info("[购物车-列表]，无参");
        // 思路：如何查询购物车列表
        // 根据登录的用户ID，去购物车列表查询
        Long userId = BaseContext.getCurrentId();
        // 调用业务对，查询购物车列表
        LambdaQueryWrapper<ShoppingCart> cartLambdaQueryWrapper = new LambdaQueryWrapper<>();
        cartLambdaQueryWrapper.eq(ShoppingCart::getUserId,userId);
        cartLambdaQueryWrapper.orderByAsc(ShoppingCart::getCreateTime);
        List<ShoppingCart> shoppingCartList = cartService.list(cartLambdaQueryWrapper);
        return R.success(shoppingCartList);
    }

    // 清空购物车
    @DeleteMapping("/clean")
    public R<String> clean(){
        // 如清空，对应哪种表
        // 根据用户ID，删除数据
        Long userId = BaseContext.getCurrentId();
        // 调用业务对，查询购物车列表,一般按什么顺序排（不确定，需求没有明确类别顺序）
        LambdaQueryWrapper<ShoppingCart> cartLambdaQueryWrapper = new LambdaQueryWrapper<>();
        cartLambdaQueryWrapper.eq(ShoppingCart::getUserId,userId);
        cartService.remove(cartLambdaQueryWrapper);
        return R.success("清空购物车成功");

    }
}
